home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / cli / mx2src.arc / SYSCALL.MOD < prev    next >
Text File  |  1989-01-05  |  8KB  |  295 lines

  1.  
  2. (*              Copyright 1987 fred brooks LogicTek             *)
  3. (*                                                              *)
  4. (*                                                              *)
  5. (*   First Release                      12/8/87-FGB             *)
  6. (* Added variable parm to StartProcess to pass info to process  *)
  7. (* in currentprocess.gemsave[15]        1/1/88-FGB              *)
  8. (* Fixed SpintInfo to give info anytime. It was giving info     *)
  9. (* only after a spint was enabled before it was executed.       *)
  10. (*                                      5/21/88-FGB             *)
  11. (*                                                              *)
  12.  
  13. (*$S-,$T- *)
  14. IMPLEMENTATION MODULE  SYSCALL;
  15. FROM    ATOMIC  IMPORT  sysvariable,CheckFlag,SetFlag,MAGIC,SIGNAL,
  16.                         spinttype;
  17. FROM    XBIOS   IMPORT  SuperExec;
  18. FROM    SYSTEM  IMPORT  CODE,ADDRESS;
  19. FROM    GEMX    IMPORT  BasePageAddress;
  20. FROM    GEMDOS  IMPORT  GetPath,GetDrv,Super;
  21. FROM    Strings IMPORT  String;
  22.  
  23. VAR     sysvar                  :       sysvariable;
  24.         sysvector [144H]        :       POINTER TO sysvariable;
  25.         goodbye                 :       BOOLEAN;
  26.         i,wait,drv              :       CARDINAL;
  27.         currentprocess          :       SIGNAL;
  28.         ssv                     :       ADDRESS;
  29.  
  30. (*$P- *)
  31. PROCEDURE       submit;
  32. BEGIN
  33.         sysvar:=sysvector^;
  34.         CODE(4e75H); (* rts *)
  35. END     submit;
  36. (*$P+ *)
  37.  
  38. PROCEDURE       SysCmd;
  39. BEGIN
  40.         MultiEnd;
  41.         SuperExec(submit); 
  42.  
  43.         FOR i:=1 TO 79 DO
  44.             sysvar.command^[i-1]:=BasePageAddress^.CmdLine[i];
  45.         END;
  46.         sysvar.command^[ORD(BasePageAddress^.CmdLine[0])]:=CHAR(0);
  47.  
  48.         MultiBegin;
  49.         (* wait until no commands are being executed *)
  50.         REPEAT
  51.         UNTIL NOT CheckFlag(sysvar.request^.req);
  52.         MultiEnd;
  53.  
  54.         (* tell SCHED that we want him to show his face *)
  55.         sysvar.request^.magic:=MAGIC;
  56.         currentprocess:=sysvar.currentprocess^;
  57.         sysvar.request^.pid:=currentprocess^.pid;
  58.         GetPath(currentprocess^.ipenvstr,0);
  59.         GetDrv(drv);
  60.         currentprocess^.flags[0]:=LONGCARD(drv);
  61.         SetFlag(sysvar.request^.req);
  62.         MultiBegin;
  63. END     SysCmd;
  64.  
  65. PROCEDURE       SysReq(VAR command: ARRAY OF CHAR);
  66. BEGIN
  67.         MultiEnd;
  68.         SuperExec(submit); 
  69.  
  70.         FOR i:=0 TO HIGH(command)-1 DO
  71.             sysvar.command^[i]:=command[i];
  72.         END;
  73.         sysvar.command^[HIGH(command)]:=0C;
  74.  
  75.         MultiBegin;
  76.         (* wait until no commands are being executed *)
  77.         REPEAT
  78.         UNTIL NOT CheckFlag(sysvar.request^.req);
  79.  
  80.         (* tell SCHED that we want him to show his face *)
  81.         sysvar.request^.magic:=MAGIC;
  82.         currentprocess:=sysvar.currentprocess^;
  83.         sysvar.request^.pid:=currentprocess^.pid;
  84.         GetPath(currentprocess^.ipenvstr,0);
  85.         GetDrv(drv);
  86.         currentprocess^.flags[0]:=LONGCARD(drv);
  87.         SetFlag(sysvar.request^.req);
  88.         MultiBegin;
  89. END     SysReq;
  90.  
  91. PROCEDURE       SysDes(VAR cp: SIGNAL);
  92. BEGIN
  93.         SuperExec(submit); 
  94.         cp:=sysvar.currentprocess^;
  95. END     SysDes;
  96.  
  97. PROCEDURE       SysVar(VAR sv: sysvariable);
  98. BEGIN
  99.         SuperExec(submit); 
  100.         sv:=sysvar;
  101. END     SysVar;
  102.  
  103. PROCEDURE       ProcessPid(): INTEGER;
  104. BEGIN
  105.         SuperExec(submit);
  106.         SysVar(sysvar);
  107.         currentprocess:=sysvar.currentprocess^;
  108.         RETURN currentprocess^.pid;
  109. END             ProcessPid;
  110.  
  111. PROCEDURE       Sleep;
  112. VAR             pid      :       INTEGER;
  113. BEGIN
  114.         pid:=ProcessPid();
  115.         SleepProcess(pid);
  116. END     Sleep;
  117.  
  118. PROCEDURE       FindProcess(pid: INTEGER; cp: SIGNAL): SIGNAL;
  119. VAR             s                :         SIGNAL;
  120. BEGIN
  121.         s:=cp;
  122.         LOOP                    (* find  process id *)
  123.           s:=s^.next;
  124.           IF s^.pid=pid THEN     (* found id *)
  125.              RETURN s;
  126.           END;
  127.           IF s^.pid=cp^.pid THEN      (* id not found in list *)
  128.              RETURN NIL;
  129.           END;
  130.         END;
  131. END     FindProcess;
  132.  
  133. PROCEDURE       CheckSpint;
  134. BEGIN
  135.         SuperExec(submit);
  136.  
  137.         FOR i:=0 TO 15 DO (* check all spints and run if set *)
  138.             IF (i IN sysvar.spintenable^)
  139.                AND (i IN sysvar.spintmask^) 
  140.                AND (ADDRESS(sysvar.spint^[i].proc)#NIL) THEN
  141.                sysvar.spint^[i].proc;
  142.             END;
  143.             EXCL(sysvar.spintenable^,i); (* clear flag after complete *)
  144.         END;
  145. END     CheckSpint;
  146.  
  147. PROCEDURE       EnableSpint(spintid: CARDINAL; routine: PROC;
  148.                             data: ADDRESS): BOOLEAN;
  149. BEGIN
  150.         SuperExec(submit);
  151.  
  152.         IF spintid>15 THEN RETURN FALSE END;
  153.         sysvar.spint^[spintid].proc:=routine;
  154.         sysvar.spint^[spintid].data:=data;
  155.         INCL(sysvar.spintmask^,spintid);
  156.         RETURN TRUE;
  157. END     EnableSpint;
  158.  
  159. PROCEDURE       SpintInfo(spintid: CARDINAL; VAR data: ADDRESS): BOOLEAN;
  160. BEGIN
  161.         SuperExec(submit);
  162.         IF spintid>15 THEN RETURN FALSE END;
  163.         data:=sysvar.spint^[spintid].data;
  164.         IF ADDRESS(sysvar.spint^[spintid].proc)#NIL THEN
  165.            RETURN TRUE;
  166.         ELSE;
  167.            data:=NIL;
  168.            RETURN FALSE;
  169.         END;
  170. END     SpintInfo;
  171.  
  172. PROCEDURE       DisableSpint(spintid: CARDINAL);
  173. BEGIN
  174.         SuperExec(submit);
  175.  
  176.         IF spintid>15 THEN RETURN END;
  177.         sysvar.spint^[spintid].proc:=PROC(NIL);
  178.         EXCL(sysvar.spintenable^,spintid);
  179.         EXCL(sysvar.spintmask^,spintid);
  180. END     DisableSpint;
  181.  
  182. PROCEDURE       HoldSpint(spintid: CARDINAL);
  183. BEGIN
  184.         SuperExec(submit);
  185.  
  186.         IF spintid>15 THEN RETURN END;
  187.         EXCL(sysvar.spintmask^,spintid);
  188. END     HoldSpint;
  189.  
  190. PROCEDURE       ReleaseSpint(spintid: CARDINAL);
  191. BEGIN
  192.         SuperExec(submit);
  193.  
  194.         IF spintid>15 THEN RETURN END;
  195.         INCL(sysvar.spintmask^,spintid);
  196. END     ReleaseSpint;
  197.  
  198. PROCEDURE       IntDelay(tick: LONGINT): INTEGER;
  199. VAR             cp      :       SIGNAL;
  200. BEGIN
  201.         SysDes(cp);
  202.         cp^.active:=FALSE; (* put process to sleep *)
  203.         MultiBegin;
  204.         REPEAT
  205.         UNTIL cp^.active; (* wait until active *)
  206. END     IntDelay;
  207.  
  208. PROCEDURE       Trigger(spintid: CARDINAL): BOOLEAN;
  209. BEGIN
  210.         SuperExec(submit);
  211.  
  212.         IF spintid>15 THEN RETURN FALSE END;
  213.         INCL(sysvar.spintenable^,spintid);
  214.         RETURN TRUE;
  215. END     Trigger;
  216.  
  217. PROCEDURE StartProcess(VAR P: PROC; 
  218.                        VAR n: LONGCARD; 
  219.                        VAR priority: INTEGER; 
  220.                        VAR pn: String;
  221.                        VAR parm: ADDRESS);
  222. BEGIN
  223.         SuperExec(submit);
  224.         currentprocess:=sysvar.currentprocess^;
  225.         sysvar.request^.pid:=currentprocess^.pid;
  226.         sysvar.StartProcess(P,n,priority,pn,parm);
  227. END     StartProcess;
  228.  
  229. PROCEDURE SwapProcess;
  230. BEGIN
  231.         SuperExec(submit);
  232.         sysvar.SwapProcess;
  233. END     SwapProcess;
  234.  
  235. PROCEDURE TermProcess(VAR id: INTEGER);
  236. BEGIN
  237.         SuperExec(submit);
  238.         sysvar.TermProcess(id);
  239. END     TermProcess;
  240.  
  241. PROCEDURE NextPid(): INTEGER;
  242. VAR     Pid     :       INTEGER;
  243. BEGIN
  244.         SuperExec(submit);
  245.         Pid:=sysvar.NextPid();
  246.         RETURN Pid;
  247. END     NextPid;
  248.  
  249. PROCEDURE SleepProcess(VAR id: INTEGER);
  250. BEGIN
  251.         SuperExec(submit);
  252.         sysvar.SleepProcess(id);
  253. END     SleepProcess;
  254.  
  255. PROCEDURE DozeProcess(VAR id: INTEGER; VAR msec: LONGCARD);
  256. BEGIN
  257.         SuperExec(submit);
  258.         sysvar.DozeProcess(id,msec);
  259. END     DozeProcess;
  260.  
  261. PROCEDURE WaitProcess(VAR id: INTEGER; VAR loc: ADDRESS;
  262.                       VAR value,mask,msec: LONGCARD);
  263. BEGIN
  264.         SuperExec(submit);
  265.         sysvar.WaitProcess(id,loc,value,mask,msec);
  266. END     WaitProcess;
  267.  
  268. PROCEDURE WakeupProcess(VAR id: INTEGER);
  269. BEGIN
  270.         SuperExec(submit);
  271.         sysvar.WakeupProcess(id);
  272. END     WakeupProcess;
  273.  
  274. PROCEDURE ChangeProcessPriority(VAR id: INTEGER; VAR pri: INTEGER);
  275. BEGIN
  276.         SuperExec(submit);
  277.         sysvar.ChangeProcessPriority(id,pri);
  278. END     ChangeProcessPriority;
  279.  
  280. PROCEDURE MultiBegin;
  281. BEGIN
  282.         SuperExec(submit);
  283.         sysvar.MultiBegin;
  284. END     MultiBegin;
  285.  
  286. PROCEDURE MultiEnd;
  287. BEGIN
  288.         SuperExec(submit);
  289.         sysvar.MultiEnd;
  290. END     MultiEnd;
  291.  
  292. BEGIN
  293. END     SYSC